package com.smart.community.commons.enums;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 系统状态枚举
 * 统一管理系统中的各种状态，合并重复的状态枚举定义
 * 根据20250703系统设计调整方案统一状态管理
 * 
 * @author Wu.Liang
 * @since 2025-07-06
 * @version 1.0.0
 */
@Getter
@AllArgsConstructor
public enum SystemStatusEnum {
    
    // ==================== 通用状态 ====================
    /**
     * 禁用
     */
    DISABLED(0, "禁用"),
    
    /**
     * 启用
     */
    ENABLED(1, "启用"),
    
    /**
     * 锁定
     */
    LOCKED(2, "锁定"),
    
    /**
     * 删除
     */
    DELETED(1, "已删除"),
    
    /**
     * 未删除
     */
    NOT_DELETED(0, "未删除"),
    
    // ==================== 审核状态（与物业公司表设计一致） ====================
    /**
     * 待审核
     */
    AUDIT_PENDING(0, "待审核"),
    
    /**
     * 审核通过
     */
    AUDIT_APPROVED(1, "审核通过"),
    
    /**
     * 审核拒绝
     */
    AUDIT_REJECTED(2, "审核拒绝"),
    
    // ==================== 用户状态 ====================
    /**
     * 用户正常
     */
    USER_NORMAL(1, "正常"),
    
    /**
     * 用户锁定
     */
    USER_LOCKED(0, "锁定"),
    
    /**
     * 用户待激活
     */
    USER_PENDING(2, "待激活"),
    
    // ==================== 业务状态 ====================
    /**
     * 业务正常
     */
    BUSINESS_NORMAL(1, "正常"),
    
    /**
     * 业务暂停
     */
    BUSINESS_PAUSED(0, "暂停"),
    
    /**
     * 业务终止
     */
    BUSINESS_TERMINATED(2, "终止"),
    
    // ==================== 支付状态 ====================
    /**
     * 待支付
     */
    PAYMENT_PENDING(0, "待支付"),
    
    /**
     * 已支付
     */
    PAYMENT_PAID(1, "已支付"),
    
    /**
     * 支付成功
     */
    PAYMENT_SUCCESS(2, "支付成功"),
    
    /**
     * 支付失败
     */
    PAYMENT_FAILED(3, "支付失败"),
    
    /**
     * 已取消
     */
    PAYMENT_CANCELLED(4, "已取消"),
    
    /**
     * 已退款
     */
    PAYMENT_REFUNDED(5, "已退款"),
    
    /**
     * 部分退款
     */
    PAYMENT_PARTIAL_REFUNDED(6, "部分退款"),
    
    // ==================== 在线状态 ====================
    /**
     * 离线
     */
    OFFLINE(0, "离线"),
    
    /**
     * 在线
     */
    ONLINE(1, "在线"),
    
    // ==================== 工作状态 ====================
    /**
     * 故障
     */
    WORK_FAULT(0, "故障"),
    
    /**
     * 正常
     */
    WORK_NORMAL(1, "正常"),
    
    /**
     * 维护
     */
    WORK_MAINTENANCE(2, "维护");
    
    @JsonValue
    private final Integer code;
    private final String description;
    
    /**
     * 根据代码获取枚举
     * 
     * @param code 状态代码
     * @return 状态枚举
     */
    public static SystemStatusEnum getByCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (SystemStatusEnum status : values()) {
            if (status.getCode().equals(code)) {
                return status;
            }
        }
        return null;
    }
    
    /**
     * 根据描述获取枚举
     * 
     * @param description 状态描述
     * @return 状态枚举
     */
    public static SystemStatusEnum getByDescription(String description) {
        if (description == null) {
            return null;
        }
        for (SystemStatusEnum status : values()) {
            if (status.getDescription().equals(description)) {
                return status;
            }
        }
        return null;
    }
    
    /**
     * 判断是否为启用状态
     * 
     * @param code 状态代码
     * @return 是否为启用状态
     */
    public static boolean isEnabled(Integer code) {
        return ENABLED.getCode().equals(code);
    }
    
    /**
     * 判断是否为禁用状态
     * 
     * @param code 状态代码
     * @return 是否为禁用状态
     */
    public static boolean isDisabled(Integer code) {
        return DISABLED.getCode().equals(code);
    }
    
    /**
     * 判断是否为锁定状态
     * 
     * @param code 状态代码
     * @return 是否为锁定状态
     */
    public static boolean isLocked(Integer code) {
        return LOCKED.getCode().equals(code);
    }
    
    /**
     * 判断是否为待审核状态
     * 
     * @param code 状态代码
     * @return 是否为待审核状态
     */
    public static boolean isAuditPending(Integer code) {
        return AUDIT_PENDING.getCode().equals(code);
    }
    
    /**
     * 判断是否为审核通过状态
     * 
     * @param code 状态代码
     * @return 是否为审核通过状态
     */
    public static boolean isAuditApproved(Integer code) {
        return AUDIT_APPROVED.getCode().equals(code);
    }
    
    /**
     * 判断是否为审核拒绝状态
     * 
     * @param code 状态代码
     * @return 是否为审核拒绝状态
     */
    public static boolean isAuditRejected(Integer code) {
        return AUDIT_REJECTED.getCode().equals(code);
    }
    
    /**
     * 判断是否为删除状态
     * 
     * @param code 状态代码
     * @return 是否为删除状态
     */
    public static boolean isDeleted(Integer code) {
        return DELETED.getCode().equals(code);
    }
    
    /**
     * 判断是否为在线状态
     * 
     * @param code 状态代码
     * @return 是否为在线状态
     */
    public static boolean isOnline(Integer code) {
        return ONLINE.getCode().equals(code);
    }
    
    /**
     * 判断是否为离线状态
     * 
     * @param code 状态代码
     * @return 是否为离线状态
     */
    public static boolean isOffline(Integer code) {
        return OFFLINE.getCode().equals(code);
    }
    
    /**
     * 根据状态代码获取描述
     * 
     * @param code 状态代码
     * @return 状态描述
     */
    public static String getDescriptionByCode(Integer code) {
        SystemStatusEnum status = getByCode(code);
        return status != null ? status.getDescription() : "未知状态";
    }
    
    /**
     * 获取所有状态代码
     * 
     * @return 状态代码数组
     */
    public static Integer[] getAllCodes() {
        SystemStatusEnum[] statuses = values();
        Integer[] codes = new Integer[statuses.length];
        for (int i = 0; i < statuses.length; i++) {
            codes[i] = statuses[i].getCode();
        }
        return codes;
    }
    
    /**
     * 获取所有状态描述
     * 
     * @return 状态描述数组
     */
    public static String[] getAllDescriptions() {
        SystemStatusEnum[] statuses = values();
        String[] descriptions = new String[statuses.length];
        for (int i = 0; i < statuses.length; i++) {
            descriptions[i] = statuses[i].getDescription();
        }
        return descriptions;
    }
    
    /**
     * Jackson反序列化方法
     * 严格遵循《系统状态枚举权威标准声明.md》规范
     * 
     * @param code 枚举值
     * @return 对应的枚举，如果不存在则返回null
     */
    @JsonCreator
    public static SystemStatusEnum fromCode(Integer code) {
        return getByCode(code);
    }
}
